/*
 * # 应用公共代码:
 *  Calendar - 日历
 * 
 * # 描述:
 *  向所有用户显示日历，并允许系统管理人员管理本组织内部使用的节假日和工作日，这是在业务中工作日计数的主要依据。
 * 
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

use "pittypat_app";
go

/*
 * # 公共函数:
 *  uuid_to_b64 - 将 uniqueidentifier 转换为对 URI 友好的 base64 字符串 char(22)
 * 
 * # 描述:
 *  将 uniqueidentifier 转换为对 URI 友好的 base64 字符串 char(22)。
 *  大多数情况下，客户端使用 base64 char(22)，如果要向客户端返回字符串格式的 uniqueidentifier，应该使用该函数对 uniqueidentifier 进行转换。
 */

if not exists (select * from "sys"."objects" where "object_id" = object_id(N'"waln_calendar"."uuid_to_b64"') and "type" in (N'FN', N'IF', N'TF', N'FS', N'FT'))
	exec('create function "waln_calendar"."uuid_to_b64"(@id uniqueidentifier) returns char(22) begin return null; end');
go

alter function "waln_calendar"."uuid_to_b64"(@id uniqueidentifier)
returns char(22)
begin
	if @id is not null
	begin
		declare @bin varbinary(16) = convert(varbinary(16), replace(convert(varchar(36), @id), '-', ''), 2);
		return replace(replace(substring(cast(N'' as xml).value('xs:base64Binary(xs:hexBinary(sql:variable("@bin")))', 'varchar(24)'), 1, 22), '/', '_'), '+', '-');
	end

	return null;
end
go

/*
 * # 公共函数:
 *  b64_to_uuid - 将对 URI 友好的 base64 char(22) uuid 转换为 uniqueidentifier
 * 
 * # 描述:
 *  将对 URI 友好的 base64 char(22) uuid 转换为 binary(16)。
 *  如果从客户端传来的值是 base64 char(22)，则应该使用该函数将字符串转换为 uniqueidentifier。
 */

if not exists (select * from "sys"."objects" where "object_id" = object_id(N'"waln_calendar"."b64_to_uuid"') and "type" in (N'FN', N'IF', N'TF', N'FS', N'FT'))
	exec('create function "waln_calendar"."b64_to_uuid"(@id char(22)) returns uniqueidentifier begin return null; end');
go

alter function "waln_calendar"."b64_to_uuid"(@id char(22))
returns uniqueidentifier
begin
	if @id is not null
	begin
		declare @b64 varchar(24) = replace(replace(@id, '-', '+'), '_', '/') + '==';
		declare @s varchar(36) = convert(varchar(36), cast(N'' as xml).value('xs:base64Binary(sql:variable("@b64"))', 'varbinary(16)'), 2);
		return cast(substring(@s, 1, 8) + '-' + substring(@s, 9, 4) + '-' + substring(@s, 13, 4) + '-' + substring(@s, 17, 4) + '-' + substring(@s, 21, 12) as uniqueidentifier);
	end

	return null;
end
go

/*
 * # 公共函数:
 *  like_escape - 转义用于 LIKE 运算符的字符串
 * 
 * # 描述:
 *  转义用于 LIKE 运算符的字符串：
 *  如果字符串是 null 或空字符串，则返回 null，
 *  否则分别使用 '[_]'、'[[]' 和 '[%]' 替换字符串中的 '_'、'[' 和 '%'，并在字符串前面和后面分别添加 '%'。
 */

if not exists (select * from "sys"."objects" where "object_id" = object_id(N'"waln_calendar"."like_escape"') and "type" in (N'FN', N'IF', N'TF', N'FS', N'FT'))
	exec('create function "waln_calendar"."like_escape"() returns nvarchar(max) begin return null; end');
go

alter function "waln_calendar"."like_escape"(@s nvarchar(max))
returns nvarchar(max)
begin
	if @s is null or @s = N''
		return null;
	return N'%' + replace(replace(replace(@s, N'[', N'[[]'), N'_', N'[_]'), N'%', N'[%]') + N'%';
end
go
